package com.zjsru.oneDay202203;

import java.util.Arrays;

/**
 * @Author: likew
 * @Date: 2022/3/27
 * 找出缺失的观测数据
 * 现有一份 n + m次投掷单个 六面 骰子的观测数据，骰子的每个面从 1 到 6 编号。观测数据中缺失了 n 份，你手上只拿到剩余m 次投掷的数据。幸好你有之前计算过的这 n + m 次投掷数据的 平均值 。
 * 给你一个长度为 m 的整数数组 rolls ，其中rolls[i] 是第 i 次观测的值。同时给你两个整数 mean 和 n 。
 * 返回一个长度为 n 的数组，包含所有缺失的观测数据，且满足这 n + m 次投掷的 平均值 是 mean 。
 * 如果存在多组符合要求的答案，只需要返回其中任意一组即可。如果不存在答案，返回一个空数组。
 *
 * 输入：rolls = [3,2,4,3], mean = 4, n = 2
 * 输出：[6,6]
 * 解释：所有 n + m 次投掷的平均值是 (3 + 2 + 4 + 3 + 6 + 6) / 6 = 4 。
 *
 * 输入：rolls = [1,5,6], mean = 3, n = 4
 * 输出：[2,3,2,2]
 * 解释：所有 n + m 次投掷的平均值是 (1 + 5 + 6 + 2 + 3 + 2 + 2) / 7 = 3 。
 *
 */
public class missingRolls {
    public int[] missingRolls(int[] rolls, int mean, int n) {
        int m = rolls.length;
        int [] res = new int[n];
        int sum = 0, sub = 0;
        for (int i = 0; i < m; i++) {
           sum += rolls[i];
        }
        sub = mean*(m + n) - sum;
        int avg = sub / n;
        //因为是用骰子确认的点，所以必须在1-6的范围内
        if(avg < 1 || avg >6){
            return new int[0];
        }
        Arrays.fill(res,avg);
        //对填充的数据进行最后校验，如不满足sum则加1
        for (int i = 0; i < sub - avg*n; i++) {
            res[i]++;
            if(res[i] > 6 || res[i] <1){
                return new int[0];
            }
        }
        return res;
       
    }
    
    /**
     * leetcode 题解
     * @param args
     */
//    public int[] missingRolls(int[] rolls, int mean, int n) {
//        int m = rolls.length, cnt = m + n;
//        int t = mean * cnt;
//        for (int i : rolls) t -= i;
//        if (t < n || t > 6 * n) return new int[0];
//        int[] ans = new int[n];
//        Arrays.fill(ans, t / n);
//        if (t / n * n < t) {
//            int d = t - (t / n * n), idx = 0;
//            while (d-- > 0) ans[idx++]++;
//        }
//        return ans;
//    }
//
    public static void main(String[] args) {
        missingRolls missingRolls = new missingRolls();
        int[] rolls = new int[]{1,5,6};
        int mean = 3;
        int n = 4;
        System.out.println(missingRolls.missingRolls(rolls, mean, n));
    }
}
